/**
 * 除2
 *
 * 题目描述
 * 给一个数组，一共有 n 个数。
 * 你能进行最多 k 次操作。每次操作可以进行以下步骤：
 * 选择数组中的一个偶数 ai 将其变成 ai/2 。
 * 现在你进行不超过 k 次操作后，让数组中所有数之和尽可能小。请输出这个最小的和。
 *
 * 输入描述:
 * 第一行输入两个正整数
 * n 和 k ，用空格隔开
 * 第二行输入 n 个正整数 ai
 * 数据范围：
 * 1≤n≤100000，1≤k≤10^9
 * 1≤ai≤10^9
 *
 * 输出描述:
 * 一个正整数，代表和的最小值。
 */

import java.util.PriorityQueue;
import java.util.Scanner;

/**
 * 这里用大根堆来将偶数全放进去, 这样我们 / 2 的时候就可以保证是拿到的偶数是最大的了
 * 时间复杂度 : O(n)
 * 空间复杂度 : O(n)
 */

public class Main {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        // 建立大根堆
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((a, b) -> {
            return b - a;
        });

        // 输入
        int n = in.nextInt(), k = in.nextInt();

        // 这里求总和
        long sum = 0;

        for (int i = 0; i < n; i++) {

            long num = in.nextLong();
            sum += num;

            // 是偶数的话就加入大根堆
            if (num % 2 == 0) {
                priorityQueue.offer((int)num);
            }
        }

        // 这里是减的总和
        long sub = 0;

        // 保证队列不为空 和 k 不为 0
        while (!priorityQueue.isEmpty() && k != 0) {

            // 拿出最大的偶数
            int num = priorityQueue.poll();

            // 除 2
            num /= 2;

            // 加入减数总和
            sub += num;

            // 判断是否为偶数
            if (num % 2 == 0) {

                // 是偶素加入堆
                priorityQueue.offer(num);
            }

            // 不是偶数不用管

            // 最后减一次次数
            k--;
        }

        // 返回
        System.out.println(sum - sub);
    }
}